package com.hkts.naturalgas.config;

import com.hkts.naturalgas.utils.DataHandlerUtils;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.List;
import java.util.Scanner;

/**
 * @ClassNameTestRundom
 * @Description
 * @Author yck
 * @Date2021-06-12 13:45
 * @Version V1.0
 **/
public class TestRundom {
    public static void main(String[] args) {
        System.out.println("请输入二进制数据: ");
            Scanner sc = new Scanner(System.in);
            String dataStr = sc.next();
        System.out.println("请输入多项式系数: ");
            String gxStr = sc.next();
            sc.close();
            //获取二进制帧的位数
            int dataStrLen = dataStr.length();
            //获取多项式位数
            int gxStrLen = gxStr.length();
            //将二进制的字符串变为整型
            int data = Integer.parseInt(dataStr);
            //将多项式的字符串变为整型
            int gx = Integer.parseInt(gxStr);
            //算出原始数据补零后的总位数
            int sum = dataStrLen+gxStrLen-1;
            //计算2的sum-1次幂

            BigInteger bi = new BigInteger("2");
            //将2的sum-1次幂转换为int型
            int flag = bi.pow(sum-1).intValue();
            //原始帧低位补零
            data = data<<(gxStrLen-1);
            //多项式低位补零,使其与补零后的帧位数一致，以便异或
            gx = gx<<(dataStrLen-1);
            //循环dataStrLen次
            for(int i=0; i<(dataStrLen);i++){
                //判断补零后的帧最高位为1还是零
                if((data&flag)!=0) {
                    data = data^gx;
                    gx = gx>>1;
                }else {
                    gx = gx>>1;
                }
                //flag最高位的1右移
                flag = flag>>1;
            }
            String crc = Integer.toBinaryString(data);
            //解决Java输出二进制时略去高位零的问题
            while(crc.length()<(gxStrLen-1)) {
                crc = "0"+crc;
            }
        System.out.println("冗余码:"+crc);
    }
}
